package com.demo.java.OD101_150.OD115;

import java.util.Stack;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【找朋友】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145698303
 */
public class OdMain {
    private static void solve(int n, String[] heights) {
        int[] resultArray = new int[n]; // 存储结果数组
        Stack<Integer> stack = new Stack<>(); // 单调栈，栈里存储身高的索引

        // 从右到左遍历身高数组
        for (int i = n - 1; i >= 0; i--) {
            // 遇到比当前身高更高的人，将栈中的元素出栈直到找到合适的位置
            while (!stack.isEmpty() && Integer.parseInt(heights[stack.peek()]) <= Integer.parseInt(heights[i])) {
                stack.pop();
            }
            // 如果栈不为空，栈顶即为第一个比当前身高高的人
            if (!stack.isEmpty()) {
                resultArray[i] = stack.peek() + 1; // 存储位置，+1是因为题目要求1-based索引
            } else {
                resultArray[i] = 0; // 如果没有比当前身高高的人，记录0
            }
            // 将当前身高的索引压入栈中
            stack.push(i);
        }

        // 输出结果
        for (int i = 0; i < resultArray.length; ++i) {
            if (i != 0) {
                System.out.print(" "); // 输出空格分隔
            }
            System.out.print(resultArray[i]);
        }
    }

    public static void main(String[] args) {
        try {
            Scanner scan = new Scanner(System.in);
            int n = Integer.parseInt(scan.nextLine());
            if (n < 0 || n > 40000) {
                System.out.println("input error");
                return;
            }
            String[] heights = scan.nextLine().split(" ");
            solve(n, heights);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}